package es.antonio.duarte.abrahamAdmin.struts.forms;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.validator.routines.DateValidator;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.validator.ValidatorForm;

import es.antonio.duarte.abrahamAdmin.struts.Constantes;

/**
 * Form encargado de recoger los datos del formulario de busqueda. Valida que la
 * fecha cumpla con el formato especificado en Constantes.FORMATO_FECHA y hace
 * la transformación String -> date necesaria
 */
public class BuscarCosasForm extends ValidatorForm {

   /** Identificador unico de la clase. */
   private static final long serialVersionUID = 6367455681590155618L;

   /** El titulo, el cuerpo o fecha por la que se buscara. */
   private String criterioBusqueda;

   /**
    * El tipo de busqueda, especificado por Constantes.BUSCAR_FECHA y
    * Constantes.BUSCAR_TITULO o Constantes.BUSCAR_CUERPO.
    */
   private int tipoBusqueda;

   /** La fecha por la que buscar una vez convertida de String. */
   private Date fechaABuscar;

   /**
    * Obtiene el valor de criterioBusqueda.
    * @return Valor de criterioBusqueda
    */
   public String getCriterioBusqueda() {
      return this.criterioBusqueda;
   }

   /**
    * Asigna el valor de criterioBusqueda.
    * @param criterioBusqueda Valor a asignar
    */
   public void setCriterioBusqueda(final String criterioBusqueda) {
      this.criterioBusqueda = criterioBusqueda;
   }

   /**
    * Obtiene el valor de tipoBusqueda.
    * @return Valor de tipoBusqueda.
    */
   public int getTipoBusqueda() {
      return tipoBusqueda;
   }

   /**
    * Asigna el valor de tipoBusqueda.
    * @param tipoBusqueda Valor a asignar
    */
   public void setTipoBusqueda(final int tipoBusqueda) {
      this.tipoBusqueda = tipoBusqueda;
   }

   /**
    * Obtiene el valor de FechaABuscar.
    * @return Valor de fechaABuscar
    */
   public Date getFechaABuscar() {
      return this.fechaABuscar;
   }

   /**
    * Asigna el valor de fechaABuscar.
    * @param fechaABuscar Valor a asignar
    */
   public void setFechaABuscar(final Date fechaABuscar) {
      this.fechaABuscar = fechaABuscar;
   }

   /**
    * Comprobamos que en caso de buscar por fechas se haya introducido una fecha
    * valida segun el formato indicado por Constantes.FORMATO_FECHA.
    * @param arg0 ActionMapping
    * @param arg1 HttpServletRequest
    * @return ActionErrors
    * @see org.apache.struts.validator.ValidatorForm#validate(org.apache.struts.action.ActionMapping,
    *      javax.servlet.http.HttpServletRequest)
    */
   @Override
   public ActionErrors validate(ActionMapping arg0, HttpServletRequest arg1) {
      ActionErrors errores = super.validate(arg0, arg1);
      if (this.tipoBusqueda == Constantes.BUSCAR_FECHA
               && criterioBusqueda != null && !criterioBusqueda.equals("")) {
         DateValidator validator = new DateValidator();
         // Valida y transforma en un mismo paso
         Date fechaNueva = validator.validate(criterioBusqueda,
                  Constantes.FORMATO_FECHA);

         if (fechaNueva == null) { // Validacion incorrecta
            ActionMessage error = new ActionMessage(
                     "buscarForm.error.criterio.fecha");
            errores.add("error", error);
         } else { // Validacion correcta
            this.fechaABuscar = fechaNueva;
         }
      }
      return errores;
   }
}
